package com.moliku.insurance.process.third;

import com.alibaba.fastjson.JSONObject;
import com.moliku.insurance.common.util.HttpUtils;
import com.moliku.insurance.common.util.JacksonUtils;
import com.moliku.insurance.model.dto.InsuranceBaseParam;
import com.moliku.insurance.model.vo.InsuranceBaseVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import java.util.Map;

@Slf4j
public abstract class BaseThirdApi {
  

  /**
   *执行请求
   *@param baseUrl 基础路径
   *@param    t 请求
   *@return
   *@throws
   *@author way
   *@date 2021/03/05 13:10
   */
  public  <R> InsuranceBaseVo<R> execute(String baseUrl, InsuranceBaseParam<R> t) {
    if(!t.formatType().equals(InsuranceBaseParam.FORMAT.JSON)){
      log.error("当前接口仅支持json格式转换");
      return null;
    }

    Map<String, Object> params= JacksonUtils.objToMap(t);
    String url=baseUrl+t.url();
    String ret= InsuranceBaseParam.METHOD.GET.equals(t.methodType())?get(url,params):post(url,params);
    log.error("远程调用 。请求url:{},请求参数:{} .返回结果:{}",url, JSONObject.toJSON(params),ret);
    return toResponse(ret,t.responseType());
  }

  /**
   *get调用
   *@param url 路径
   *@param params 请求参数
   *@return
   *@throws
   *@author way
   *@date 2021/03/05 13:10
   */
  protected String get(String url, Map<String, Object> params){
    String get=buildGetUrl(url,params);
    log.error("GET 请求。请求url:{},请求参数:{} .封装后请求:{}",url,params,get);

    try {
      return HttpUtils.doGet(get);
    }catch (Exception e){
      return null;
    }
  }

  /**
   *post调用
   *@param url 路径
   *@param params 请求参数
   *@return
   *@throws
   *@author way
   *@date 2021/03/05 13:10
   */
  protected   String post(String url,Map<String, Object> params){
    try {
      return HttpUtils.doPost(JSONObject.toJSON(params).toString(),url,"application/json");
    }catch (Exception e){
      return null;
    }
  }

  /**
   *拼接请求
   *@param url 请求路径
   *@param params 请求参数
   *@return
   *@throws
   *@author way
   *@date 2021/03/05 13:10
   */
  public  String buildGetUrl(String url, Map<String, Object> params){
    StringBuffer requestSB=new StringBuffer(url);
    if(!CollectionUtils.isEmpty(params.keySet())){
      requestSB.append("?");
      boolean first=true;
      for(String key:params.keySet()){
        if(null!=params.get(key)) {
          if(!first){
            requestSB.append("&");
          }
          first=false;
          requestSB.append(String.format("%s=%s", key, params.get(key).toString()));
        }
      }
    }

    return requestSB.toString();
  }

  /**
   *消息转换为Response
   *@param responseStr 返回数据
   *@return
   *@throws
   *@author way
   *@date 2021/03/05 13:10
   */
  protected abstract  <T> InsuranceBaseVo<T>  toResponse(String responseStr,Class<T> clazz);


}
